/* Nama File : point.h                              */
/* Deskripsi : File header dari class Point         */
/* Anggota Kelompok : Dekha Anggareska 13510050		*/
/*                    Fadhil Muhtadin 13510070		*/
/*                    Muhammad Iqbal 13510064		*/
/*                    Yulius Nainggolan 13510090	*/

#ifndef point_h
#define point_h

#include <iostream>
using namespace std;

class Point{
	public:
	/* Empat Sekawan */
	Point();
	/* Konstruktor Point */
    /* I.S. Point belum tercipta */
    /* F.S. Point tercipta */
	Point(int, int);
	/* Konstruktor Point dengan parameter */
    /* I.S. Point belum tercipta */
    /* F.S. Point tercipta */
	Point(const Point&);
	/* CCtor Point */
    /* I.S. Point terdefinisi */
    /* F.S. Point baru tercipta sebagai kopi Point sebelumnya */
	~Point();
	/* Destruktor Point */
	/* I.S. Point terdefinisi */
    /* F.S. Point dimusnahkan */
	Point& operator=(const Point&);
    /* Melakukan assignment terhadap Point */
    /* I.S. Point terdefinisi */
    /* F.S. Point baru diassign dengan Point sebelumnya */

	/* Getter & Setter */
	void setX(int);
	/* Melakukan Set terhadap nilai absis dari Point */
	/* I.S. Point terkonstruksi */
    /* F.S. Data absis bernilai xi */
	void setY(int);
	/* Melakukan Set terhadap nilai ordinat dari Point */
	/* I.S. Point terkonstruksi */
    /* F.S. Data ordinat bernilai yi */
	int getX() const;
	/* Mendapatkan nilai absis dari Point */
	int getY() const;
	/* Mendapatkan nilai ordinat dari Point */
	
	/* Method lain */
	int IsUp (Point);
	/* Mengembalikan 1 apabila P2 berada diatas P1, x kedua point sama */
	
	int IsDown (Point);
	/* Mengembalikan 1 apabila P2 berada dibawah P1, x kedua point sama */
	
	int IsRight (Point);
	/* Mengembalikan 1 apabila P2 berada dikanan P1, y kedua point sama */
	
	int IsLeft (Point);
	/* Mengembalikan 1 apabila P2 berada dikiri P1, y kedua point sama */
	
	int IsUpRight(Point);
	/* Mengembalikan nilai 1 apabila P2 berada di sebelah kanan atas P1 */

	int IsUpLeft(Point);
	/* Mengembalikan nilai 1 apabila P2 berada di sebelah kiri atas P1 */
	
	int IsDownRight(Point);
	/* Mengembalikan nilai 1 apabila P2 berada di sebelah kanan bawah P1 */
	
	int IsDownLeft(Point);
	/* Mengembalikan nilai 1 apabila P2 berada di sebelah kiri bawah P1 */
	
	int IsEq(Point);
	/* Mengembalikan nilai 1 bila P2 dan P1 merupakan point yang sama */

	int IsAbove(Point);
	/* Mengembalikan nilai 1 bila P2 berada di atas P1, x kedua point tidak harus sama */
	
	int IsBelow(Point);
	/* Mengembalikan nilai 1 bila P2 berada di bawah P1, x kedua point tidak harus sama */
	
	int isBetween(Point, Point);
	/* Mengembalikan nilai 1 bila P1 segaris dengan Pa dan Pb dan berada diantara Pa dan Pb */
	
	int isBoundaryIntersect(Point, Point);
	/* Mengembalikan nilai sesuai tipe perpotongan garis thisPoint-P1 dengan P3-P4 */
	/* 0 bila tidak berpotongan */
	/* 1 bila berpotongan */
	/* 4 bila thisPoint berada pada sisi bidang */
	/* 5 bila titik perpotongan adalah titik sudut dan titik perpotongan merupakan titik paling bawah dari garis P3-P4 */
	/* 6 bila titik perpotongan adalah titik sudut dan titik perpotongan merupakan titik paling atas dari garis P3-P4 */
	/* 7 bila thisPoint merupakan salah satu titik sudut */
	
	friend ostream& operator<<(ostream&, Point&);
	/* Mencetak Point ke layar */
	/* I.S. Point terdefinisi */
    /* F.S. Point tercetak di layar */

	protected:
	/* Data Member */
	int x; //absis
	int y; //ordinat
};
#endif
